package cn.lili.modules.goods.service;

import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.distribution.entity.vos.HomeResult;
import cn.lili.modules.goods.entity.dos.Goods;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.dto.GoodsHotPopularDTO;
import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
import cn.lili.modules.goods.entity.vos.GoodsVO;
import cn.lili.modules.operationcenter.entity.dto.OperationCenterSupplierDTO;
import cn.lili.modules.operationcenter.entity.vos.OperationCenterSupplierVo;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.promotion.entity.vos.BoxMhgoodsVO;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 商品业务层
 *
 * @author pikachu
 * @since 2020-02-23 16:18:56
 */
public interface GoodsService extends IService<Goods> {


    /**
     * 根据品牌获取商品
     *
     * @param brandIds 品牌ids
     */
    List<Goods> getByBrandIds(List<String> brandIds);

    /**
     * 清除goods缓存
     *
     * @param goodsId goodsId
     */
    void clearCache(String goodsId);

    /**
     * 更新商品参数
     *
     * @param goodsId 商品id
     * @param params  商品参数
     */
    void updateGoodsParams(String goodsId, String params);

    /**
     * 获取某分类下的商品数量
     *
     * @param categoryId 分类ID
     * @return 商品数量
     */
    long getGoodsCountByCategory(String categoryId);

    /**
     * 修改商品
     *
     * @param goods 商品
     */
    void updateGoods(Goods goods);


    /**
     * 商品查询
     *
     * @param goodsSearchParams 查询参数
     * @return 商品分页
     */
    Page<GoodsVO> queryByParams(GoodsSearchParams goodsSearchParams);


    /**
     * 商品查询
     *
     * @param goodsSearchParams 查询参数
     * @return 商品分页
     */
    Page<Goods> queryGoodsByParams(GoodsSearchParams goodsSearchParams);



    /**
     * 商品查询
     *
     * @param goodsSearchParams 查询参数
     * @return 商品信息
     */
    List<Goods> queryListByParams(GoodsSearchParams goodsSearchParams);


    /**
     * 商品id查询
     *
     * @param goodsSearchParams 查询参数
     * @return 商品信息
     */
    List<String> queryListIdByParams(GoodsSearchParams goodsSearchParams);

    /**
     * 商品查询
     *
     * @param goodsSearchParams 查询参数
     * @return 商品信息
     */
    List<String> queryListStoreIdByParams(GoodsSearchParams goodsSearchParams);

    /**
     * 设置商品运费模板
     *
     * @param goodsIds   商品列表
     * @param templateId 运费模板ID
     * @return 操作结果
     */
    Boolean freight(List<String> goodsIds, String templateId);

    /**
     * 修改商品库存数量
     *
     * @param goodsId  商品ID
     * @param quantity 库存数量
     */
    void updateStock(String goodsId, Integer quantity);

    /**
     * 根据全部sku信息更新商品库存数量
     *
     * @param goodsSkus 全部商品sku信息
     */
    void updateStock(List<GoodsSku> goodsSkus);


    /**
     * 同步最新商品库存
     *
     * @param goodsId 商品id
     */
    void syncStock(String goodsId);

    /**
     * 更新商品评价数量
     *
     * @param goodsId 商品ID
     */
    void updateGoodsCommentNum(String goodsId);

    /**
     * 更新商品的购买数量
     *
     * @param goodsId  商品ID
     * @param buyCount 购买数量
     */
    void updateGoodsBuyCount(String goodsId, int buyCount);

    /**
     * 统计店铺的商品数量
     *
     * @param storeId 店铺id
     * @return 商品数量
     */
    long countStoreGoodsNum(String storeId);

    /**
     * 手动调整商品的评价数量
     *
     * @param commentNum 评价数量
     * @param goodsId    商品ID
     */
    void addGoodsCommentNum(Integer commentNum, String goodsId);

    /**
     * 根据参数查询商品信息
     *
     * @param goodsSearchParams 查询参数
     * @return 商品信息
     */
    Goods getGoodsByParams(GoodsSearchParams goodsSearchParams);

    long countGoodsNum(GoodsSearchParams goodsSearchParams);


    void updateGoodsIntro(Goods goods);

    /**
     * 查询盲盒商品
     */
    List<GoodsVO> geBlindbox();


    /**
     * 获取绿色积分商品或非绿色积分商品的id列表
     *
     * @param isGreenGoods
     * @return
     */
    List<String> getGoodsIdListByGreenFlag(Integer isGreenGoods);

    ResultMessage<Object> sycn();

    public String getToken();
    //    ResultMessage<Object> getPlatformGoodsList(GoodsSearchParams goodsSearchParams);
    public ResultMessage<Object> getCategoryTree();

    public Boolean addGoods(GoodsSearchParams goodsSearchParams);

//    public ResultMessage<Object> updateIndexByStoreId(String storeId);

    /**
     * 如果图片为空，则数据库补全
     * */
    Page<EsGoodsIndex> esGoodsIndicesNull(Page<EsGoodsIndex> esGoodsIndices);

    /**
     * 校验商品是否下架
     * */
    Page<EsGoodsIndex> esGoodsIndicesDown(Page<EsGoodsIndex> esGoodsIndices);

    ResultMessage<Object> getDownCount(String scene);

    ResultMessage<Object> clearCacheByStoreId(String storeId);

    void isDown(String goodsIds);

    void updateThirdPartyPlatformId();

    public List<Goods> goodsConversion(List<JSONObject> productVOList);

    public List<JSONObject> getPlatformGoodsList(GoodsSearchParams goodsSearchParams);

    public Map<String, List> goodsSkusConversion(List<JSONObject> productDetailVOList, List<Goods> goodsList);

    public List<JSONObject> getPlatformGoodsDetail(List<Integer> goodsIds);

    public Boolean addStorage(List<Integer> ids);

    public void syncGoods();

    void updateCategoryById(String ids, String categoryPathSon, String categoryPathSonName);

    void updateCategoryByIdOrSupplierId(String ids, String categoryPathSon, String categoryPathSonName);

    /**
     * 清除goods缓存
     * @param goodsIds
     */
    void cleanGoodsCache (List<String> goodsIds);

    boolean createGoods(BoxMhgoodsVO boxMhgoodsVO);

    ResultMessage<Object> add(GoodsVO goodsVO);

    ResultMessage<Object> mhDelete(String ids);

    ResultMessage<Object> mhUpdate(GoodsVO goodsVO);

    ResultMessage<Object> mhPublish(Integer publishType, String id);


    /**
     * 获取门票商品信息
     * @return
     */
    Goods getTicketGoods ();

    /**
     * 活动选择商品
     * @param searchParams
     * @return
     */
    Page<Goods> getGoodsByPage(GoodsSearchParams searchParams);

    /**
     * 获取商品列表
     * @param dto
     * @return
     */
    Page<Goods> selectGoodsList(GoodsHotPopularDTO dto);

    ResultMessage<HomeResult> commodityQuantityStatistics();


    /**
     * 根据供应商id集合获取商品数量
     * @param storeIds
     * @return
     */
    long getGoodsCountByStoreIds (List<String> storeIds, String marketEnable);

    /**
     * 根据供应商id集合获取本月商品数量
     * @param storeIds
     * @return
     */
    long getCurrentMonthGoodsCountByStoreIds (List<String> storeIds);

    long getGoodsCountByParams (List<String> storeIds, Date startTime, Date endTime);

    /**
     * 运营中心-服务商-供货商家列表
     * @param dto
     * @return
     */
    Page<OperationCenterSupplierVo> getSupplierByPage(OperationCenterSupplierDTO dto);

    List<Order> sycnFreeOrder();

    /**
     * 免税商品-获取前20条热销商品
     * @param params
     * @return
     */
    Page<GoodsVO> getHotSalesGoods(GoodsSearchParams params);

    /**
     * 免税商品-获取最新50条新上架商品
     * @param params
     * @return
     */
    Page<GoodsVO> getNewestGoods(GoodsSearchParams params);

    /**
     * 统计商品总数
     *
     * @param storeId 店铺id
     * @return sku总数
     */
    Long countSkuNumByGoods(String storeId);
}